package Day_0226.FactoryPattern;

/**
 * @author zxc
 * @date 2023/02/26 19:55
 **/
public class SimpleFactoryPattern {
    public static void main(String[] args) {
        /**
         * 谈一谈对于简单工厂模式的理解
         * ===》
         * 1.简单工厂模式
         * ===》
         * （1）简单工厂模式，相当于是一个工厂中有各种产品，
         * （2）创建在一个类中，客户无需知道具体产品的名称，只需要知道产品类所对应的参数即可。
         * （3）但是工厂的职责过重，而且当类型过多时，不利于系统的扩展维护。
         * ===》
         * 总结 ：
         * （1）即，在简单工厂模式中，核心工厂类中包含了所有可能出现的产品类;
         * （2）即，产品类是继承了某个工厂接口的;
         * （即，其必须需要实现工厂接口中所定义的抽象方法 && 也可以扩展产品类的功能[即，实现工厂接口中未定义的方法，构成该类的特有功能]）
         * （3）通过调用核心工厂类中某个方法 && 传递某些特定参数，即可以获取该核心工厂类中所定义的某个对象;
         *
         * 2.简单工厂的优点/缺点
         * （1）优点 ：
         *  简单工厂模式能够根据外界给定的信息，决定究竟应该创建哪个具体类的对象。
         *  明确区分了各自的职责和权力，有利于整个软件体系结构的优化。
         * （2）缺点 ：
         *  很明显工厂类集中了所有实例的创建逻辑，容易违反GRASPR的高内聚的责任分配原则
         *
         * 3.简单工厂模式
         * （1）即，定义产品抽象接口，其是需要所有定义的产品类对于该接口进行实现;
         * （2）即，定义核心工厂类，其中提供了所有产品类实例的创建;
         *
         */
        Car aodi =CarFactory.createCar("奥迪");
        Car bmw =CarFactory.createCar("宝马");
        aodi.run();
        bmw.run();
    }

}
// 1.创建工厂接口
interface Car {
    public void run();
}
// 2.定义产品类（继承工厂接口）
class Bmw implements Car {
    public void run() {
        System.out.println("我是宝马汽车...");
    }
}
class AoDi implements Car {
    public void run() {
        System.out.println("我是奥迪汽车..");
    }
}
// 3.创建核心工厂类（其中包含了所有可能出现的产品类）
class CarFactory {
    public static Car createCar(String name) {
        if ("".equals(name)) {
            return null;
        }
        if(name.equals("奥迪")){
            return new AoDi();
        }
        if(name.equals("宝马")){
            return new Bmw();
        }
        return null;
    }
}

